perm filename JUST.OLD[XAP,BGB] blob sn#052886 filedate 1973-07-06 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00003 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	SUBR(TEXT)	Put character into line buffer and test overflow
 00007 00003	SUBR(LBFLUSH)	Flush line buffer
 00012 ENDMK
⊗;
SUBR(TEXT)	;Put character into line buffer and test overflow
BEGIN TEXT
	LAC 1,CHAR
	CAR A00(1)		;SPECIAL CHARACTER?
	JUMPN 0,COMMAND		;YES, REQUIRES SPECIAL HANDLING
↑TEXT2:	SETZM CRFLAG
	SETZM SPFLAG
TJLOAD:	SKIPE TJPTR	;Is line buffer set up?
	GO TJLOA1	;Yes
	LAC 0,[POINT 7,LINBUF]
	DAC 0,TJPTR	;Setup pointer to end of pointer
	SETZM TJSPTR	;Clear pointer to last space
	SETZM TJSCNT	;Clear space count
	SETZM TJSPOS	;Clear column of space
	SETZM TJHEIGHT	;Clear maximum height for row
	SETZM TJDEPTH	;Clear maximum depth for row
	SETZM TJODEPTH	;Clear old maximum depth for row
	LACI 0,5*LINLEN	;Setup character count
	DAC 0,TJCNT
	LAC 0,COL
	DAC 0,TJLMAR	;Left margin for text justification.
	LAC 0,RMAR
	DAC 0,TJRMAR	;Rigth margin for text justification,
	DAC 0,TJSPOS
	SETOM TJFONT	;Force initial font select
TJLOA1:	SKIPN TJMODE
	GO TJLOA4
	LAC 0,COL	;Check for overflow
	CAMGE 0,RMAR
	GO TJLOA4
	CALL LBFLUSH	;Flush line buffer
	SETOM LFFLAG
	LAC 0,LMAR
	DAC 0,TJLMAR
	DAC 0,COL
TJLOA4:	LAC 2,FONT	;Pick up current font
	CAMN 2,TJFONT	;Same as previous?
	GO TJLOA3	;Yes
	LACI 0,177	;No, same change, and output escape
	IDPB 0,TJPTR
	SOSG TJCNT	;End test
	CALL LBLOSE
	IDPB 2,TJPTR	;Output font number
	SOSG TJCNT	;End test
	CALL LBLOSE
	DAC 2,TJFONT	;Remember current font
	SKIPN 2,FONTAB(2)	;Make sure there is a font
	GO [ FATAL<NO FONT DEFINED> ]
	LAC 0,203(2)		;Pick up height above baseline
	CAMLE 0,TJHEIGHT	;Update max. height
	DAC 0,TJHEIGHT		;New max. height
	LAC 0,201(2)		;Pick up total height
	SUB 0,203(2)		;Subtract height above baseline to get depth
	CAMLE 0,TJDEPTH		;Update max. depth
	DAC 0,TJDEPTH
	CAIE 1," "	;Space is a special case
	POP0J
	LAC 0,TJPTR	;Remember pointer to last character before space
	DAC 0,TJSPTR
	LAC 0,COL
	DAC 0,TJSPOS
	AOS TJSCNT
	POP0J
TJLOA3:	LAC 2,FONTAB(2)		;Fetch font pointer
	ADD 2,1		;Update column
	CAR 2,(2)
	ADDM 2,COL
	IDPB 1,TJPTR	;Deposit character in line buffer
	SOSLE TJCNT
	POP0J
LBLOSE:	FATAL<LINE BUFFER FULL!>

COMMAND:CAIN 1," "
	GO [ SKIPE CRFLAG
	     CALL LBFLUSH
	     SETZM CRFLAG
	     SKIPE SPFLAG
	     GO [ SKIPLE TJMODE
		  POP0J
		  GO TJLOAD ]
	     SETOM SPFLAG
	     GO TJLOAD ]
	CAIN 1,11
	GO [ LAC 1,COL
	     DAC 1,TJRMAR
	     DAC 1,TJSPOS
	     LAC 1,TJPTR
	     DAC 1,TJSPTR
	     AOS TJSCNT
	     PUSH P,0
	     CALL LBFLUSH
	     SETZM CRFLAG
	     SETZM SPFLAG
	     POPJ P,]
	CAIN 1,15
	GO [ SKIPLE TJMODE
	     GO [ SETOM CRFLAG
		  LACI 1," "
		  SKIPN SPFLAG
		  GO TJLOAD
		  POP0J ]
	     CALL LBFLUSH
	     LAC 1,LMAR
	     DAC 1,COL
	     DAC 1,TJLMAR
	     SETOM CRFLAG
	     POP0J ]
	CAIN 1,12
	GO [ SKIPLE TJMODE
	     POP0J
	     CALL LBFLUSH
	     LAC 1,COL
	     DAC 1,TJLMAR
	     SETOM LFFLAG
	     SETZM SPFLAG
	     POP0J ]
	CAIN 1,14
	GO [ PUSH P,0
	     GO LBFLUSH ]
	GO @0

BEND TEXT
SUBR(LBFLUSH)	;Flush line buffer
BEGIN LBFLUSH
	PTR←16
	MODE←15
	SPACNT←14
	EXTRA←13
	SKIPN TJPTR		;Empty check!
	POP0J
	PUSH P,1		;Save ACS
	PUSH P,EXTRA
	PUSH P,SPACNT
	PUSH P,MODE
	PUSH P,PTR
	PUSH P,FONT		;Save current font number
	PUSH P,CHAR		;Save current character
LOOP0:	LAC PTR,[POINT 7,LINBUF];Init. line buffer pointer
	CAMN PTR,TJPTR		;Another empty check
	GO RET
	LAC MODE,TJMODE
	SKIPN LFFLAG		;Has line feed been accounted for?
	GO LFOK
;The following 5 lines of code is inadaquate but will have to do for awhile.
	LAC 1,TJODEPTH		;Do line feed
	CAMGE 1,TJDEPTH
	LAC 1,TJDEPTH		;Use max of current and last depth
	ADD 1,TJHEIGHT		;Plus height
	ADD 1,XLINE
	ADDM 1,ROW
	LAC 1,TJDEPTH
	DAC 1,TJODEPTH
	SETZM LFFLAG
	CALL ROWCHK		;End test
LFOK:	LAC EXTRA,TJRMAR	;Calculate number of unused columns
	SUB EXTRA,TJSPOS
	LAC 1,TJLMAR
	DAC 1,COL
	JUMPE MODE,[ LAC 1,TJPTR	;CLIP mode uses end pointer instead
		     DAC 1,TJSPTR	;of space pointer
		     GO .+1 ]
	SKIPE TJSPTR
	GO LOOP1
	LAC 1,TJPTR
	DAC 1,TJSPTR
LOOP1:	CAMN PTR,TJSPTR		;Done yet?
	GO MOVTXT		;Yes
	ILDB 1,PTR		;No, pick up another character
	CAIN 1,177		;Font select?
	GO [ ILDB 1,PTR
	     CAIN 1,177
	     GO .+1		;No, escape for Rubout
	     DAC 1,FONT		;Yes, change fonts
	     GO LOOP1 ]
	DAC 1,CHAR
	CAIN 1," "		;If space and
	CAIE MODE,1		;iF double justified.
	GO [ CALL PRINT		;Vanilla flavored character
	     GO LOOP1 ]
ADDSPA:	LAC 0,EXTRA		;Calculate addition to space size
	IDIV 0,TJSCNT
	SUB EXTRA,0		;Subtract from unused columns
	SOSGE TJSCNT		;Decrement count of spaces
	HALT .			;Loser!
	LAC 1,FONT		;Fetch space size
	SKIPN 1,FONTAB(1)
	GO [ FATAL<NO FONT DEFINED> ]
	HLRZ 1," "(1)
	ADD 1,0			;Add extra space to be added
	ADDM 1,COL
	GO LOOP1
MOVTXT:	LAC PTR,[POINT 7,LINBUF];Move remainder of line to beginning
	LAC EXTRA,TJSPTR
	JUMPLE MODE,MOVTX1
	LDB 1,EXTRA
	CAIN 1," "
	IBP 1,EXTRA
MOVTX1:	LACI 0,5*LINLEN		;Setup character count
	DAC 0,TJCNT
	LACI 1,177
	IDPB 1,PTR
	SOS TJCNT
	LAC 1,FONT
	IDPB 1,PTR
	SOS TJCNT
LOOP3:	SKIPN 1,FONTAB(1)
	GO [ FATAL<NO FONT DEFINED!> ]
	LAC 0,203(1)
	CAMLE 0,TJHEIGHT
	DAC 0,TJHEIGHT		;Init. maximum height for row
	LAC 0,201(1)
	SUB 0,203(1)
	CAMLE 0,TJDEPTH
	DAC 0,TJDEPTH		;Init. maximum depth for row
LOOP2:	CAMN EXTRA,TJPTR	;At end yet?
	GO SETPAR
	ILDB 1,EXTRA
	IDPB 1,PTR
	SOS TJCNT
	CAIE 1,177
	GO LOOP2
	ILDB 1,EXTRA
	IDPB 1,PTR
	SOS TJCNT
	CAIN 1,177
	GO LOOP2
	GO LOOP3
SETPAR:	DAC PTR,TJPTR		;Setup pointer to end of pointer
	LAC 1,RMAR
	DAC 1,TJRMAR
	SETZM TJSPTR		;Clear pointer to last space
	SETZM TJSCNT		;Clear space count
	JUMPL MODE,LOOP0
RET:	POP P,CHAR		;Restore character
	POP P,FONT		;Restore font number
	POP P,PTR		;Restore ACS
	POP P,MODE
	POP P,SPACNT
	POP P,EXTRA
	POP P,1
	POP0J
BEND LBFLUSH
LBALL:	PUSH P,TJMODE
	SETOM TJMODE
	CALL LBFLUSH
	POP P,TJMODE
	POP0J